$Description$
给出$N$个点,是否存在$3$个点,它们组成的三角形面积为$S$。
$Solution$
如果确定了三角形的一条边,我们可以将整个坐标系旋转一下,使这条边成为新的$y$轴,这时候我们只要分别对$y$轴的两边分别进行二分即可
我们发现:可以先预处理一下每两个点之间的直线,记录一下起点终点和斜率。
首先所有点按$x$坐标从小到大排序。然后对直线进行极角排序。
当我们处理到直线$AB$时,$AB$就成为了$y$轴,且$A,B$是相邻的(它们距离$y$轴距离都为$0)($假设$A$位置在$B$的上面).然后到下一条直线时,由于斜率从小到大,所以是把整个图顺时针旋转了一点点,直到下一条直线成为$y$轴。那么这个时候把$A,B$在序列中的位置交换一下就行了。因为如果有别的点对相对顺序改变,那么这个点对的斜率一定介于这两条直线之间。下面口胡一下。
假设现在我们以$l_1$为$y$轴。有一组点对,$P$和$Q$,它们相对于$l_1$的横坐标分别是$a$和$b$,其中$a<b$。
然后我们看到比$l_1$斜率更小的第一条直线$l_2$。首先,可以保证,$A$和$B$一定在直线$l_2$的同侧。因为如果$A$和$B$在$l_2$的异侧,那$ABCD$这四个点一定可以生成一条斜率介于$l_1$和$l_2$之间的直线(画一画就知道了),而我们是把斜率排了序,保证了不会有这种情况出现。现在,将整个图再顺时针旋转一点点,使$l_2$成为新的y轴。那么可以保证,$A$和$B$的相对顺序一定是改变了的,而且是把$A$和$B$的排位交换了一下。(可以脑补一下$AB$在$CD$下侧的情况,是同理的).这时候,我们看到$PQ$,在新的y轴下,$P$的横坐标是$c,Q$的横坐标是$d$,假设$c>d$,那么$PQ$的斜率一定比$l_2$的斜率要大,因为$PQ$逆时针旋转一点点就与$l_2$平行。
对于旋转过后排位会变化的点对(除$AB$外),一定会满足$PQ$的条件$:a<b$且$c>d$。但是我们发现它的斜率介于$l_1$和$l_2$之间,然鹅比$l_1$斜率更小的第一条直线是$l_2$,不是$PQ$,与前提矛盾,所以不存在这样的$PQ$。
那么就可以保证从$l_1$旋转到$l_2$时,受影响的就只有$l_1$上的两个点。
$Code$
1 |
|